iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

練習用圖

  1. cookie.jpg

內容

  1. 開運算與閉運算:

    1.1 用途:藉由圖像灰階、二值化與開閉運算,獲得遮罩(Mask),可應用在以下領域。

    • 影像合成(如:前後景影像疊加)
    • 物件偵測

    1.2 開運算

    • 流程:執行腐蝕運算(黑色區域變大),再執行膨脹運算(白色區域變大)。
    • 目的:移除影像中的白色雜訊或線條(連接黑色區塊)。

    1.3 閉運算

    • 流程:先執行膨脹運算(白色區域變大),再執行腐蝕運算(黑色區域變大)。
    • 目的:移除影像中的黑色雜訊(連接白色區塊)。

    1.4 程式碼

    import cv2
    import numpy as np
    
    # 顯示圖檔
    def show_img(name, img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
    
    image_path = './cookie.jpg'
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    image = cv2.resize(image, (250, 250))
    show_img('origin', image)
    
    # 二值化
    ret, mask1 = cv2.threshold(image, 160, 255, cv2.THRESH_BINARY)
    show_img('mask_origin', mask1)
    
    # 二值化+開運算
    kernel=np.ones((5, 5), np.uint8)
    ret, mask2 = cv2.threshold(image, 160, 255, cv2.THRESH_BINARY)
    mask2 = cv2.morphologyEx(mask2, cv2.MORPH_OPEN, kernel, iterations=1)
    show_img('OPEN', mask2)
    
    # 二值化+閉運算
    kernel=np.ones((5, 5),np.uint8)
    ret, mask3 = cv2.threshold(image, 160, 255, cv2.THRESH_BINARY)
    mask3 = cv2.morphologyEx(mask3, cv2.MORPH_CLOSE, kernel, iterations=1)
    show_img('CLOSE', mask3)
    

    1.5 執行結果

    • mask_origin:影像二值化時,左下角出現黑色躁點、餅乾中出現白色躁點。
    • OPEN:連接mask_origin左下角黑色區域與消除餅乾中白色雜訊。
    • CLOSE:消除mask_origin左下角黑色雜訊與連接餅乾中白色區域。

  2. 常用濾波器

    2.1 Gaussian Filtering(線性濾波器)

    • 原理:Kernal滑窗內權重符合高斯分布(越中間權重越大),移動時會對鄰近像素值進行加權,作為中心位置的像素值。
    • 用途:保留圖像主要特徵,同時降低躁點影響。
    • 程式碼
      import cv2
      
      # 顯示圖檔
      def show_img(name, img):
          cv2.imshow(name, img)
          cv2.waitKey(0)
      
      image_path = './peach.jpg'
      image = cv2.imread(image_path)
      image = cv2.resize(image, (350, 350))
      show_img('origin', image)
      
      gaussian = cv2.GaussianBlur(image, (13, 13), 0)
      show_img('GaussianBlur', gaussian)
      
    • 注意事項:Kernal size必須是奇數元組,如:(3, 3)或(5, 5)。

    2.2 Median Filtering(非線性濾波器)

    • 原理:Kernal滑窗移動時,會取鄰近像素的中位數,作為中心位置的像素值。
    • 用途:過濾圖像中的椒鹽雜訊。
    • 程式碼
      import cv2
      
      # 顯示圖檔
      def show_img(name, img):
          cv2.imshow(name, img)
          cv2.waitKey(0)
      
      image_path = './peach.jpg'
      image = cv2.imread(image_path)
      image = cv2.resize(image, (350, 350))
      show_img('origin', image)
      
      median = cv2.medianBlur(image, 13)
      show_img('Median', median)
      
    • 注意事項:Kernal size必須是奇數值,如:3或5。

    2.4 執行結果

    • Gaussian Filtering:保留桃子的主要特徵(如:粉色斑點分布)。
    • Median Filtering:桃子上的粉紅斑點變得更模糊。


小結

  1. 下一站,我們前往「OpenCV影像合成」:將結合4天影像處理技巧進行影像合成。
  2. 另外,若有興趣從頭學習影像處理基礎概念,可參考數位影像處理Youtube課程

讓我們繼續看下去...


參考資料

  1. 简单的图像处理——2. 图像的形态学操作:开运算与闭运算
  2. OpenCV Python Tutorials

上一篇
《第5天》OpenCV影像處理(三)
下一篇
《第7天》OpenCV影像合成
系列文
Object Detection and Image Processing with Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言